/*
 * Copyright (c) 2006-2025, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2025-09-30     Guotong Refactor to use drv_uart2 driver
 */

#include <rtthread.h>
#include <board.h>
#include <rtdbg.h>
#include <stdlib.h>
#include <string.h>
/* 引入驱动头文件 */
#include "drivers/servo.h"
#include "drivers/key.h"
#include "drivers/drv_uart2.h"

#define DBG_TAG "main"
#define DBG_LVL DBG_LOG

/**
 * @brief  按键事件处理回调函数
 * @param  type: 按键事件类型
 * @retval 无
 */
static void key_event_handler(int type)
{
    int current_gear = servo_get_current_gear();
    
    if (type == KEY_EVENT_SHORT_PRESS)
    {
        /* 短按：前进一个档位 */
        servo_set_gear(current_gear + 1);
        
        /* 通过串口2打印按键信息 */
        char feedback[32];
        rt_snprintf(feedback, sizeof(feedback), "KEY: Short press, Gear changed to %d\r\n", servo_get_current_gear());
        uart2_send((uint8_t *)feedback, rt_strlen(feedback));
    }
    else if (type == KEY_EVENT_LONG_PRESS)
    {
        /* 长按：后退一个档位 */
        servo_set_gear(current_gear - 1);
        
        /* 通过串口2打印按键信息 */
        char feedback[32];
        rt_snprintf(feedback, sizeof(feedback), "KEY: Long press, Gear changed to %d\r\n", servo_get_current_gear());
        uart2_send((uint8_t *)feedback, rt_strlen(feedback));
    }
}

/* 定义命令缓冲区大小 */
#define CMD_BUF_SIZE 16

/* 命令缓冲区 */
static char cmd_buf[CMD_BUF_SIZE] = {0};
static int cmd_index = 0;

/**
 * @brief  串口2数据接收回调函数
 * @param  data: 接收到的数据
 * @retval 无
 */
static void uart2_rx_data_handler(uint8_t data)
{
    /* 处理接收到的数据 */
    if (data == '\r' || data == '\n')
    {
        /* 收到回车或换行符，解析命令 */
        if (cmd_index > 0)
        {
            /* 尝试将命令缓冲区转换为整数 */
            int gear = atoi(cmd_buf);
            
            /* 检查命令是否有效（0-6范围内）*/
            if (gear >= 0 && gear <= 6)
            {
                /* 有效命令，设置舵机档位 */
                servo_set_gear(gear);
                
                /* 通过串口2发送确认信息 */
                char feedback[32];
                rt_snprintf(feedback, sizeof(feedback), "OK: G%d\r\n", servo_get_current_gear());
                uart2_send((uint8_t *)feedback, rt_strlen(feedback));
            }
            else
            {
                /* 无效命令，发送错误提示 */
                const char* error_msg = "ERROR: Invalid command. Enter 0-6.\r\n";
                uart2_send((uint8_t *)error_msg, rt_strlen(error_msg));
            }
            
            /* 清空命令缓冲区 */
            memset(cmd_buf, 0, sizeof(cmd_buf));
            cmd_index = 0;
        }
    }
    else if (cmd_index < CMD_BUF_SIZE - 1)
    {
        /* 将字符添加到命令缓冲区 */
        cmd_buf[cmd_index++] = data;
    }
    else
    {
        /* 命令缓冲区已满，清空并提示错误 */
        memset(cmd_buf, 0, sizeof(cmd_buf));
        cmd_index = 0;
        
        const char* error_msg = "ERROR: Command too long.\r\n";
        uart2_send((uint8_t *)error_msg, rt_strlen(error_msg));
    }
}

int main(void)
{
    /* 初始化舵机 */
    servo_init();
    
    /* 初始化按键 */
    key_init();
    key_register_callback(key_event_handler);
    key_timer_init();
    
    /* 设置串口2数据接收回调函数 */
    uart2_set_rx_callback(uart2_rx_data_handler);
    
    /* 设置舵机初始位置 */
    servo_set_gear(3);  // 初始档位为中间档位(70°，30-110度范围的中间位置)
    
    LOG_D("OpenDropper system initialized");
    /* 通过串口2发送系统就绪提示信息 */
    const char* welcome_msg = "OpenDropper system ready. Waiting for commands (0-6).\r\n";
    uart2_send((uint8_t *)welcome_msg, rt_strlen(welcome_msg));
    

    /* 主循环 */
    while (1)
    {
        /* 系统空闲时可以执行其他任务 */
        rt_thread_mdelay(1000);
    }

    return RT_EOK;
}
